package com.gxa.ssm340.aspect;

import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Date;

/**
 * 设计一个切面
 * @author Lenovo
 */
//@Aspect
//@Component
public class TXAspect {

    /**
     * 声明切点
     * 要定义切点的完整路径信息:全部的包名+类名+方法（访问权限）
     *
     * 第一个*表示访问权限
     * 第二个表示类
     * 第三个* 表示方法
     * .. 表示任意类型的任意数量的参数
      */
    @Pointcut("execution(* com.gxa.ssm340.service.impl.*.*(..))")
    public void pointCut(){}

    @Autowired
    SqlSessionFactory sqlSessionFactory ;



    /**
     * 环绕通知
     * 在执行时，需要通过执行连接点获取原方法
     */
    @Around("pointCut()")
    public Object around(ProceedingJoinPoint proceedingJoinPoint){
        Object proceed = null;
        SqlSession sqlSession = null;
        try {

            //模拟事务的执行流程
            sqlSession = sqlSessionFactory.openSession(false);


            proceed = proceedingJoinPoint.proceed();

            sqlSession.commit();

            return proceed;
        } catch (Throwable t) {

            sqlSession.rollback();

        }finally {

           sqlSession.close();

        }

        return proceed;
    }
}
